
/**
* @Title: SynchronousQueueTest.java
* @Package com.leetone
* @Description: 【】
* @date 2018年9月1日 下午2:19:10
* @version V1.0
* @Company: 上海未泰信息技术有限公司
* @author:[谭磊][leetone123@163.com]
*/

package com.leetone;

import java.util.concurrent.Semaphore;
import java.util.concurrent.SynchronousQueue;

/**
* @ClassName: SynchronousQueueTest
* @Description: 【同步队列的实例测试,不能存储数据，相当于一个传球手】
* @date 2018年9月1日 下午2:19:10
* @Company: 上海未泰信息技术有限公司
* @author:[谭磊][leetone123@163.com]
* 该队列有公平模式和非公平模式之分：
* 公平模式会采用一个公平锁，并分配一个FIFO队列来阻塞多余的生产者和消费者，从而体现整个公平策略；
* 反之采用非公平锁，同时配合一个LIFO队列来管理多余的生产者和消费者；
* 后一种模式如果生产者和消费者的处理速度有差距，则很容易出现饥渴的现象，即某些数据永远得不到处理
*/

public class SynchronousQueueTest {
	public static void main(String[] args) {
		System.out.println("begin:\t"+System.currentTimeMillis() / 1000);
		//定义一个Synchronous
		final SynchronousQueue<String> sq = new SynchronousQueue<>();
		//定义一个数量为1的信号量，相当于一个互斥锁
		final Semaphore sem = new Semaphore(1);
		for(int i =0;i<10;i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					// TODO Auto-generated method stub
					try {
						sem.acquire();
						String input = sq.take();
						String output = TestDo.doSome(input);
						System.out.println(Thread.currentThread().getName()+":\t"+output);
						sem.release();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}).start();
		}
		for(int i=0;i<10;i++) {
			String input = i +"";
				try {
					sq.put(input);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
	}
}
class TestDo{
	public static String doSome(String input) {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String output = input + ":"+System.currentTimeMillis() / 1000;
		return output;
	}
}